mod t2501_thread;
mod t2502_map_reduce;

use std::thread;
use std::time::Duration;

fn main() {
    let name01 = "子线程01";
    // let name02 = "子线程02";
    let name03 = "子线程03";
    // 创建一个新线程并使用 move 将 name 移动到闭包中这样新建线程就拥有 name 了
    // 如果不需要传参数，把 move 移除就可以了
    let handler01 = thread::spawn(move || {
        for i in 1..10 {
            println!("{}--{}", name01, i);
            // `thread::sleep()` 会让线程睡眠一段时间，
            // 某个线程睡眠的时候会让出 CPU，可以让不同的线程交替执行，
            // 要看操作系统如何调度线程。
            thread::sleep(Duration::from_millis(100))
        }
    });
    let handler02 = thread::spawn(thread02);
    let handler03 = thread::spawn(move || {
        thread03(name03)
    });

    for i in 1..5 {
        println!("主线程--{}", i);
        thread::sleep(Duration::from_millis(100));
    }
    // 上面的例子主线程结束后，子线程还没有运行完，但是子线程也结束了。
    // 如果想让子线程结束后，主线程再结束，我们就要使用Join 方法，把子线程加入主线程等待队列。
    handler01.join().unwrap();
    handler02.join().unwrap();
    handler03.join().unwrap();
}

fn thread02() {
    for i in 1..10 {
        println!("子线程02--{}", i);
        thread::sleep(Duration::from_millis(100));
    }
}

fn thread03(name: &str) {
    for i in 1..10 {
        println!("{}--{}", name, i);
        thread::sleep(Duration::from_millis(100));
    }
}